package cn.bass.marketing.common.resp;

import cn.bass.marketing.common.enums.ErrorEnums;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Objects;


@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Response<T> {

    /**
     * 响应代码
     */
    @ApiModelProperty("响应代码")
    protected String code;

    /**
     * 响应消息
     */
    @ApiModelProperty("响应消息")
    protected String msg;

    /**
     * 响应数据
     */
    @ApiModelProperty("响应数据")
    protected T data;

    /**
     * 成功
     *
     * @param msg 消息
     * @param <T> 返回数据类型
     * @return DataResponse
     */
    public static <T> Response<T> success(String msg) {
        return new Response<>("0000", msg, null);
    }


    /**
     * 成功
     *
     * @param data 消息
     * @param <T>  返回数据类型
     * @return DataResponse
     */
    public static <T> Response<T> data(T data) {
        return new Response<>("0000", "成功", data);
    }

    /**
     * 成功
     *
     * @param msg  消息
     * @param data 数据
     * @param <T>  返回数据类型
     * @return DataResponse
     */
    public static <T> Response<T> success(String msg, T data) {
        return new Response<>("0000", msg, data);
    }

    /**
     * 响应成功
     * @param data 数据
     */
    public static <T> Response<T> success(T data) {
        return new Response<>(ErrorEnums.SUCCESS.getCode(), ErrorEnums.SUCCESS.getMsg(), data);
    }


    /**
     * 失败
     *
     * @return Response
     */
    public static <T> Response<T> failed() {
        CommonError error = CommonError.error();
        return new Response<>(error.getCode(), error.getMsg(), null);
    }


    /**
     * 失败
     *
     * @return Response
     */
    public static <T> Response<T> failed(String msg) {
        CommonError error = CommonError.error(msg);
        return new Response<>(error.getCode(), error.getMsg(), null);
    }

    /**
     * 失败
     *
     * @return Response
     */
    public static <T> Response<T> failed(String msg, T data) {
        CommonError error = CommonError.error(msg);
        return new Response<>(error.getCode(), error.getMsg(), data);
    }

    /**
     * 失败
     *
     * @return Response
     */
    public static <T> Response<T> failed(CommonError error) {
        return new Response<>(error.getCode(), error.getMsg(), null);
    }

    /**
     * @param code 代码
     * @param msg  消息
     * @param data 数据
     * @param <T>  数据类型
     * @return 结果
     */
    public static <T> Response<T> response(String code, String msg, T data) {
        return new Response<>(code, msg, data);
    }

    public static Response<String> error(String code, String msg, String respContent) {
        return new Response<>(code, msg, respContent);
    }


    /**
     * 判断响应结果是否成功
     *
     * @return 结果
     */
    @ApiModelProperty("响应状态")
    public boolean isSuccess() {
        if (Objects.isNull(code)) {
            return false;
        }
        return Objects.equals("0000", code);
    }

}
